#ifndef __ATTRI_H__
#define __ATTRI_H__

#include <string.h>
#include <assert.h>
#include <stdbool.h>
#include "map.h"
#include "Err.h"


enum _type{
    INT,
    FLOAT,
    ARRAY,
    STRUCT,
    STRUCTDEF,
    FUNC
};

struct _mempara;
struct _attri;

//used to represent attributes in struct or function parameters
struct _mempara    
{
    char* name;
    struct _attri* val;
    struct _mempara* link; 
};

struct _attri
{
    int type;
    union{
        struct _array{
            struct _attri* subAttri;
            int size; 
        } uarray;
        struct _struct{
            map_t* structDefMap;
        } ustruct;
        struct _structDef{
            struct _mempara* memAttri;
        } ustructDef;
        struct _func{
            struct _attri* retType;
            int paraNum;
            struct _mempara* paraAttri;
        } ufunc;
    };
};

typedef struct _attri attri;
typedef struct _mempara mempara;

mempara* newMempara(const char* name, attri* val);
mempara* copyMempara(mempara* src);
void freeMempara(mempara* m);

attri* newBaseAttri(int type);
attri* newArrayAttri(attri* subAttri, int size);
attri* newStructAttri(map_t* structDefMap);
attri* newStructDefAttri(mempara* memAttri);
attri* newFuncAttri(attri* retType, mempara* paraAttri);
attri* copyAttri(attri* src);
void freeAttri(attri* a);



void printMempara(mempara* tmp);
void printAttri(attri* tmp);

bool attriEqual(attri* t1, attri* t2);
bool memparaEqual(mempara* mp1, mempara* mp2);

#endif